package com.tedu.day02.oop;

/**
 * 类：成员变量 成员方法 构造方法
 * 抽象类：成员变量 成员方法 构造方法
 * 创建抽象类----普通类变成【实现】子类---继承抽象类
 *       成员变量：既可以的变量也可以是常量
 *       构造方法：有，用于子类调用抽象类的成员变量--赋值
 *       成员方法：可以是抽象，也可以是非抽象
 *             抽象方法与非抽象方法出现在抽象类的问题
 *             1.有抽象方法 【重写】强制子类完成父类的抽象方法
 *             2.非抽象方法【拓展】子类继承的事情，提高代码的复用性
 */
abstract class Foo{
    //成员变量
    public int i=10;
    public final int J=20;
    //强类型语言:大小写分明
    //构造方法

    public Foo() {
        this(30); //调用当前类的对象其他构造器
    }

    public Foo(int i) {
        this.i = i;
    }
    //定义一个抽象方法
    public abstract void show();
    //定义一个非抽象方法
    public void method(){
        System.out.println("Foo method");
    }
}
//实现子类
class Goo extends Foo{
    public void show() {
    }
    public void method(){
        System.out.println("Goode method");
    }
}
public class 抽象类补充知识点 {
    public static void main(String[] args) {
        //使用抽象类--继承---多态---向上造型
        Foo foo=new Goo();
        //1实例化---子类的构造器，默认存在无参构造器，同时里面存在super()
        //通过super()执行，抽象类里的无参构造器
        System.out.println(foo.i);
        System.out.println(foo.J);

        //---------------
        foo.show();
        foo.method();
    }
}
//拓展abstract 冲突问题
abstract class Aoo{
    //private abstract void show1(); //private私有的，仅在本类中使用，abstract需要继承
    //public final abstract void show2(); //final最终不可更改
    //public static abstract void show3();
}
